# -*- coding: utf-8 -*-

import datetime
import logging
import subprocess

from PyQt5.QtCore import QThreadPool
from PyQt5.QtGui import QTextCursor
from PyQt5.QtWidgets import (QPushButton, QLineEdit,
                             QListWidget, QAbstractItemView, QMenuBar,
                             QInputDialog, QMessageBox, QGridLayout,
                             QPlainTextEdit, QApplication)

from modules.config import version
from modules.help import HelpWindow
from modules.hosts import Hosts
from modules.settings_window import SettingsWindow
from modules.system import CompKabSolutionWindow, run_command
from modules.workers import GetWorks, CleanWorks, RecreateStudent, OpenSFTP, UpdateList, \
    SSHCommandInThreads


class TeacherWindow(CompKabSolutionWindow):
    def __init__(self, app: QApplication):
        super().__init__()
        # self.windows = []
        self.hosts = Hosts()
        self.app = app

        self.settings_window = SettingsWindow()
        self.help_window = HelpWindow()

        menu_bar = QMenuBar()
        menu_file = menu_bar.addMenu('Меню')
        action_help = menu_file.addAction('Справка')
        action_set = menu_file.addAction('Настройка')
        action_exit = menu_file.addAction('Выход')

        action_help.triggered.connect(self.help)
        action_set.triggered.connect(self.settings)
        action_exit.triggered.connect(self.close)

        grid = QGridLayout()
        self.setLayout(grid)

        grid.setMenuBar(menu_bar)

        names = [
            'Собрать работы',
            'Очистить работы',
            'Пересоздать учётную запись ученика',
            # 'Удалить student',
            'Открыть проводник',
            'Отобразить номер',
        ]
        functions = [
            self.get_works,
            self.clean_works,
            self.backup_student,
            # self.delete_student,
            self.open_sftp,
            self.display_name
        ]
        hints = (
            "Копирует работы из папки Сдать работы на рабочем столе каждого ученика в папку Работы на рабочем столе учителя",
            "Очищает папку Сдать работы на рабочем столе каждого ученика",
            "В разработке",
            "Открывает домашнюю папку удалённого компьютера в mc на компьютере учителя",
            "Отображает номер каждого удалённого устройства"
        )

        for i in range(len(names)):
            button = QPushButton(names[i])
            button.clicked.connect(functions[i])
            if i == 2:
                button.setDisabled(True)
            button.setToolTip(hints[i])
            grid.addWidget(button, 4, i)

        button = QPushButton('Выбрать всё')
        button.clicked.connect(self.select_all)
        grid.addWidget(button, 1, 0)
        button = QPushButton('Очистить выбор')
        button.clicked.connect(self.select_none)
        grid.addWidget(button, 1, 1)

        self.hosts_items = QListWidget()
        self.hosts_items.setSelectionMode(QAbstractItemView.ExtendedSelection)
        hosts_from_file = self.hosts.to_list()
        self.hosts_items.addItems(hosts_from_file)
        grid.addWidget(self.hosts_items, 2, 0, 1, 5)

        self.textfield = QPlainTextEdit()
        self.textfield.cursor = QTextCursor()
        self.textfield.setReadOnly(True)
        grid.addWidget(self.textfield, 3, 0, 1, 5)

        self.move(300, 150)
        self.setWindowTitle(f'Управление компьютерным кабинетом, версия {version}')
        self.setFixedWidth(800)
        self.setMinimumHeight(500)

        self.show()

        if not hosts_from_file:
            self.help()

        self.thread = UpdateList()
        self.thread.finished.connect(self.thread.deleteLater)
        self.thread.progress_signal.connect(self.update_hosts_list)
        self.thread.hosts = self.hosts
        self.thread.start()

    # def get_all_items(self):
    #     items = []
    #     for item_index in range(self.hosts_items.count()):
    #         items.append(self.hosts_items.item(item_index))
    #     return items

    def get_selected_items_with_confirm(self):
        selected_items = self.hosts_items.selectedItems()
        items = []
        for item in selected_items:
            items.append(self.hosts[item.text()].hostname)
        if not items:
            dlg = QMessageBox(self)
            dlg.setWindowTitle("Ошибка")
            dlg.setText("Выберите хотя бы один компьютер из списка")
            button = dlg.exec()
            if button == QMessageBox.Ok:
                return None
        return items

    def update_hosts_list(self, hosts_list):
        self.hosts_items.blockSignals(True)

        self.hosts = Hosts()
        self.hosts_items.clear()
        self.hosts_items.addItems(hosts_list)
        logging.info("Обновлен список устройств в QListWidget")

        self.hosts_items.blockSignals(False)

    def select_all(self):
        self.hosts_items.selectAll()

    def select_none(self):
        self.hosts_items.clearSelection()

    def update_textfield(self, message):
        self.textfield.appendPlainText(message)

    def get_works(self):
        self.textfield.clear()
        comps = self.get_selected_items_with_confirm()
        if comps:
            date = str(datetime.datetime.now().date())
            text, okPressed = QInputDialog.getText(self, "Введите название", "Название папки:", QLineEdit.Normal, "")
            if okPressed and text:
                self.thread = GetWorks()
                self.thread.hosts_list = comps
                self.thread.date = date
                self.thread.text = text

                self.thread.start_signal.connect(self.update_textfield)
                self.thread.progress_signal.connect(self.update_textfield)
                self.thread.finish_signal.connect(self.update_textfield)
                self.thread.finished.connect(self.thread.deleteLater)

                self.thread.start()

            elif okPressed and not text:
                dlg = QMessageBox(self)
                dlg.setWindowTitle("Ошибка")
                dlg.setText("Необходимо ввести название")
                button = dlg.exec()
                if button == QMessageBox.Ok:
                    return
            else:
                return
        else:
            return

    def clean_works(self):
        self.textfield.clear()
        comps = self.get_selected_items_with_confirm()
        if comps:
            self.thread = CleanWorks()
            self.thread.hosts_list = comps

            self.thread.start_signal.connect(self.update_textfield)
            self.thread.progress_signal.connect(self.update_textfield)
            self.thread.finish_signal.connect(self.update_textfield)
            self.thread.finished.connect(self.thread.deleteLater)

            self.thread.start()

    def backup_student(self):
        self.textfield.clear()
        comps = self.get_selected_items_with_confirm()
        if comps:
            # student_pass, okPressed = QInputDialog.getText(
            #     self, "Определите пароль", "Пароль для student:", QLineEdit.Password, ""
            # )
            # if okPressed and student_pass:
            self.thread = RecreateStudent()
            self.thread.hosts_list = comps
            # self.thread.student_pass = student_pass

            self.thread.start_signal.connect(self.update_textfield)
            self.thread.progress_signal.connect(self.update_textfield)
            self.thread.finish_signal.connect(self.update_textfield)
            self.thread.finished.connect(self.thread.deleteLater)

            self.thread.start()
            # elif okPressed and not student_pass:
            #     dlg = QMessageBox(self)
            #     dlg.setWindowTitle("Ошибка")
            #     dlg.setText("Необходимо ввести пароль для учётной записи student")
            #     button = dlg.exec()
            #     if button == QMessageBox.Ok:
            #         return
        else:
            return

    # def delete_student(self):
    #     self.textfield.clear()
    #     comps = self.get_selected_items_with_confirm()
    #     if comps:
    #         self.thread = DeleteStudent()
    #         self.thread.hosts_list = comps
    #
    #         self.thread.start_signal.connect(self.update_textfield)
    #         self.thread.progress_signal.connect(self.update_textfield)
    #         self.thread.finish_signal.connect(self.update_textfield)
    #         self.thread.finished.connect(self.thread.deleteLater)
    #
    #         self.thread.start()

    def open_sftp(self):
        self.textfield.clear()
        comps = self.get_selected_items_with_confirm()
        if comps:
            if len(comps) == 1:
                self.thread = OpenSFTP()
                self.thread.hosts_list = comps

                self.thread.start_signal.connect(self.update_textfield)
                self.thread.progress_signal.connect(self.update_textfield)
                self.thread.finish_signal.connect(self.update_textfield)
                self.thread.finished.connect(self.thread.deleteLater)

                self.thread.start()
            else:
                dlg = QMessageBox(self)
                dlg.setWindowTitle("Ошибка")
                dlg.setText("Выберите один компьютер из списка")
                button = dlg.exec()
                if button == QMessageBox.Ok:
                    return

    def display_name(self):
        self.textfield.clear()
        # pool = QThreadPool.globalInstance()
        for index, host in enumerate(self.hosts.items_to_list()):
            number_string = f"\<h1\>{index + 1}\<\/h1\>"
            run_command(f"sshpass -p {host.student_pass} ssh {host.student_login}@{host.hostname} kdialog --passivepopup \"{number_string}\" 10;")
            # runnable = SSHCommandInThreads(host, command)
            # runnable.progress_signal.signal.connect(self.update_textfield)
            # pool.start(runnable)
        self.update_textfield("Команда отправлена на устройства")

    def settings(self):
        if self.settings_window.isVisible():
            logging.info("Закрыты настройки")
            self.settings_window.hide()
        else:
            # self.settings_window.show()
            current_user_groups = subprocess.run(["groups"], shell=True, capture_output=True).stdout.decode()
            if "wheel" in current_user_groups.split():
                logging.info("Открыты настройки")
                self.settings_window.show()
            else:
                logging.info("Пользователь не в группе wheel")
                dlg = QMessageBox(self)
                dlg.setWindowTitle("Ошибка")
                dlg.setText("Недостаточно прав")
                button = dlg.exec()
                if button == QMessageBox.Ok:
                    return None

    def help(self):
        if self.settings_window.isVisible():
            logging.info("Закрыта справка")
            self.help_window.hide()
        else:
            logging.info("Открыта справка")
            self.help_window.show()

    def close(self):
        logging.info("Приложение завершило работу")
        self.app.exit(0)

    def closeEvent(self, event):
        event.accept()
        self.close()
